/*
 *2020年11月5日
 *@author:huhu
 */
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class Test {
    volatile static int[] data = {11,12,13,14,15,16,17,18,19,20};
    volatile static int producePointer = 0;//生产者生产产品的指针
    volatile static int consumePointer = 0;//消费者消费产品的指针
    static LinkedList<Producer> producerLinkedList;
    static LinkedList<Consumer> consumerLinkedList;

    static int max=30;  //生产的产品次数

    volatile static int c = 0;  //消费者消费的产品次数

    static int producerCount;//生产者数量
    static int consumerCount;//消费者数量
    static int produceSpeed;//生产速度
    static int consumeSpeed;//消费速度

    static WritableWorkbook book;
    static WritableSheet sheet;
    public static void main(String[] args) throws IOException {

        for (int i = 0 ; i < data.length ; i++){
            data[i] = (int) (19*Math.random()+1);//1-20的随机数
            System.out.print(data[i]+" ");
        }
        System.out.println();
//        producerCount = (int) (Math.random()*4)+1;
        producerCount = 1;
        System.out.print("生产者个数"+producerCount+" ");
        consumerCount = 2;
        System.out.println("消费者个数"+consumerCount);
        produceSpeed = 1;
        consumeSpeed = 20;
        System.out.print("生产周期"+produceSpeed+" ");
        System.out.println("消费周期"+consumeSpeed);
        System.out.println("====生产消费活动模拟开始====");
        //本实验为一个消费者生产者的模拟实现程序
		/*本次代码从信号量的await优化，使用了多线程的LinkedBlockingQueue数据结构来实现
			BlockingQueue阻塞队列方法
			它是一个已经在内部实现了同步的队列，
			实现仍然采用的是await和signal的方法，但是它可在生成对象时指定容量大小。
			使用本数据结构可以自动完成阻塞的一系列动作，无需再进行其他的手动操作
		*/
        Staging_Area staging_Area = new Staging_Area();

        consumerLinkedList = new LinkedList<>();
        producerLinkedList = new LinkedList<>();
        //初始化生产者
        for (int i = 0; i < producerCount; i++) {
            producerLinkedList.add(new Producer(staging_Area,i));
        }
        //初始化消费者
        for (int i = 0; i < consumerCount; i++) {
            consumerLinkedList.add(new Consumer(staging_Area,i));
        }
        try {
            // 打开文件
            book = Workbook.createWorkbook(new File("huhu.xls"));
            // 生成名为"sheet1"的工作表，参数0表示这是第一页
            sheet = book.createSheet("sheet1", 0);

            //此方法在使用py2.py时打开
//            for (int i = 0; i < consumerCount; i++) {
//                sheet.addCell(new Label(i,0,"消费者"+i));
//            }

            //所有生产者都在一个线程里循环按照顺序生产
            Producer producerThread = new Producer(staging_Area);
            new Thread(producerThread).start();

            //每个消费者各自拥有自己线程进行消费，顺序随机
            for (int i = 0; i < consumerCount; i++) {
                Consumer consumeThread = consumerLinkedList.get(i);
                new Thread(consumeThread).start();
            }
            // 写入数据并关闭文件

        } catch (Exception e) {
            System.out.println(e);
        }finally{
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            book.write();
            if(book!=null){
                try {
                    book.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

